<?php

/**
 * @file cefpdf.php
 * @brief Clase para generar pdf
 * @author DyrTechnologies
 * @version V 1.1
 * @date Wed Oct 03 2007
 *
 *  Part of the CEFIRO dynamic web framework project
 *
 *  Copyright (C) 2007  Dyr technologies http://dyrtech.com.ve
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

define("CEF_FOLDER","cefiro");
$cefpdfdir 	= dirname(__FILE__);
$cefdirpos 	= strpos($cefpdfdir,CEF_FOLDER);
$tamcefdir	= strlen($cefpdfdir);
require_once(substr($cefpdfdir,0,$cefdirpos+strlen(CEF_FOLDER))."/lib/dompdf/dompdf_config.inc.php");

define("FULL_URL_LIB",substr(FULL_URL,0,strpos(FULL_URL,CEF_FOLDER)+strlen(CEF_FOLDER))."/lib/dompdf/");

define("DOMPDF",FULL_URL_LIB."dompdf.php");

/**
 * @brief Macros para los indices de los colores en el arreglo que los contiene
 */
define("CEF_R",0);
define("CEF_G",1);
define("CEF_B",2);

/**
 * @brief Macros para los indices del arreglo de estilos en las tablas
 *
 */
define("CEF_TABLE",0);
define("CEF_TH",1);
define("CEF_TD",2);


/**
 * Se definen los tipos de Displays
 */
define("ANCHOR",0);
define("DIRECT_LINK",1);
/**
 * @class Clase cefpdf
 */

class cefpdf{

	private $name;
	private $input_file;
	private $output_file;
	private $label;
	private $paper;
	private $orientation;
	private $base_path;

	private $extra;

	public function cefpdf($name, $input_file, $output_file, $label, $paper = "letter", $orientation = "portrait", $base_path = NULL, $extra = NULL){
		$this->name			= $name;

		/**
		 * @brief Se revisa la extension del archivo de entrada y dependiendo de la extension se ajustan los parametros requeridos
		 */
		$input_file = $this->check_ifile($input_file);

		$this->input_file 	= $input_file;

		$this->output_file 	= $output_file;
		$this->label 		= $label;
		$this->paper 		= $paper;
		$this->orientation	= $orientation;
		$this->base_path	= $base_path;

		$this->extra		= $extra;
	}

	public function set_input($input_file){
		$this->input_file = $input_file;
	}

	public function set_output($output_file){
		$this->output_file = $output_file;
	}

	public function set_label($label){
		$this->label = $label;
	}

	public function set_paper($paper){
		$this->paper = $paper;
	}

	public function set_orientation($orientation = "portrait"){
		$this->orientation = $orientation;
	}

	public function set_base_path($base_path = NULL){
		$this->base_path = $base_path;
	}

	public function set_name($name){
		$this->name = $name;
	}

	public function set_extra($extra){
		$this->extra = $extra;
	}

	public function get_input(){
		return $this->input_file;
	}

	public function get_output(){
		return $this->output_file;
	}

	public function get_label(){
		return $this->label;
	}

	public function get_paper(){
		return $this->paper;
	}

	public function get_orientation(){
		return $this->orientation;
	}

	public function get_base_path(){
		return $this->base_path;
	}

	public function get_name(){
		return $this->name;
	}

	public function get_extra(){
		return $this->extra;
	}

	/**
	 * Devuelve una variable con una ventana que hace referencia al archivo que crea el pdf
	 *
	 * @return String $pdf_direct_link
	 */
	private function display_direct_link(){
		$pdf_direct_link 	 = "location.href = '".DOMPDF."?input_file=".$this->get_input();
		$pdf_direct_link		.= "&paper=".$this->get_paper();
		$pdf_direct_link		.= "&output_file=".$this->get_output();
		$pdf_direct_link		.= "&orientation=".$this->get_orientation();

		if(isset($this->base_path) && $this->base_path != NULL)
		$pdf_direct_link	.= "&base_path=".$this->get_base_path();

		if($this->extra != NULL)
			$pdf_direct_link	.= $this->get_extra();

		$pdf_direct_link		.= "';";

		return $pdf_direct_link;
	}

	/**
	 * Devuelve una variable con un ancla que hace referencia al archivo que crea el pdf
	 *
	 * @return String $pdf_anchor
	 */
	private function display_anchor(){
		$pdf_anchor 	 = "<a href='".DOMPDF."?input_file=".$this->get_input();
		$pdf_anchor		.= "&paper=".$this->get_paper();
		$pdf_anchor		.= "&output_file=".$this->get_output();
		$pdf_anchor		.= "&orientation=".$this->get_orientation();

		if(isset($this->base_path) && $this->base_path != NULL)
		$pdf_anchor	.= "&base_path=".$this->get_base_path();

		$pdf_anchor		.= "'";

		if($this->extra != NULL)
			$pdf_anchor	.= $this->get_extra();

		$pdf_anchor	.= ">".$this->get_label()."</a>";

		return $pdf_anchor;
	}

	public function display($type = ANCHOR, $fetch = false){
		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		if($type == ANCHOR)
			$pdf_display = $this->display_anchor();
		else if($type == DIRECT_LINK)
			$pdf_display = $this->display_direct_link();

		if(!$fetch)
			$smarty->assign($this->get_name(),$pdf_display);
		else
			return $pdf_display;
	}

	/**
	 * @brief Funcion para ajustar el tipo de archivo de entrada
	 */

	private function check_ifile($inputfile){
		$dot = strpos($inputfile,".");
		$ext = substr($inputfile,$dot+1,strlen($inputfile)-$dot-1);

		switch ($ext) {
			case 'tpl':

				global $smarty;
				$tmpfile = tempnam("/tmp","dompdf_");
				file_put_contents($tmpfile,$smarty->fetch($inputfile));
				$inputfile = rawurlencode($tmpfile);

				break;

			default:
				break;
		}

		return $inputfile;
	}

	static public function margins($margins = NULL){
		if($margins == NULL)
			return;

		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		if(isset($margins['top']))
			$smarty->assign("top",$margins['top']);
		else
			$smarty->assign("top",0);

		if(isset($margins['bottom']))
			$smarty->assign("bottom",$margins['bottom']);
		else
			$smarty->assign("bottom",0);

		if(isset($margins['right']))
			$smarty->assign("right",$margins['right']);
		else
			$smarty->assign("right",0);

		if(isset($margins['left']))
			$smarty->assign("left",$margins['left']);
		else
			$smarty->assign("left",0);


		return $smarty->fetch('margins.tpl');

	}

	static public function headers($headers = NULL, $img = NULL, $hr = NULL, $center = false, $x=0, $y=0){

		if( 	(	$headers== NULL 	|| 	$headers== false )	&&
				(	$img 	== NULL 	|| 	$img 	== false )	&&
				(	$hr 	== NULL 	||	$hr 	== false )
			)
			return;

		/**
	 	 * @brief Valor de Retorno
	 	 */
		$retval = "";

		if(!$center){
			$imgx = $x;
			$textx 	= $x;
		}
		else{
			$imgx = 0;
			$textx = 0;
		}
		$hrx	= $x;
		$imgy 	= $y;
		$texty 	= $y;
		$hry	= $y;

		if(isset($img['position']))
			switch ($img['position']){

				case 'up':
					if(isset($img['height']))
						$texty+=$img['height'];

					break;

				case 'left':
					if(isset($img['width']) && $center)
						$textx+=$img['width']/2;
					else if(isset($img['width']))
						$textx+=$img['width'];

					/**
					 * Si el pìe de pagina esta centrado se mueve la imagen a la izquierda del texto
					 */
					if($center && ($headers != NULL || $headers != false) )
						$imgx -= cefpdf::get_text_width($headers)/2;

					break;

				case 'right':

					$textwidth = cefpdf::get_text_width($headers);

					if(isset($img['width']) && $center)
						$textx-=$img['width']/2;
					else if(isset($img['width']))
						$textx-=$img['width'];

					$imgx+=$textwidth;

					/**
					 * Si el pìe de pagina esta centrado se mueve la imagen a la derecha del texto
					 */
					if($center && ($headers != NULL || $headers != false) )
						$imgx -= cefpdf::get_text_width($headers)/2;

					break;

				case 'down';

					$textheight = cefpdf::get_text_height($headers);
					$imgy+=$textheight;

					break;
			}

		/**
		 * Se consigue la posicion vertical de la linea del encabezado
		 * Solo nos interesa si esta ajustado algun valor para la linea horizontal
		 */

		if(	$hr != NULL	&& $hr != false ){
			$imgysize 	= $imgy + $img['height'];
			$textysize	= $texty + cefpdf::get_text_height($headers);
			$hry = $imgysize > $textysize ? $imgysize : $textysize;
		}

		$retval.=cefpdf::img($img,$center,$imgx,$imgy);
		$retval.=cefpdf::text($headers,$center,$textx,$texty);
		$retval.=cefpdf::horizontalrule($hr,$hrx,$hry);

		return $retval;
	}

	static public function footers($footers = NULL, $img = NULL, $hr = NULL, $center = false, $x=0, $y=0){

		if( 	(	$footers== NULL 	|| 	$footers== false )	&&
				(	$img 	== NULL 	|| 	$img 	== false )	&&
				(	$hr 	== NULL 	||	$hr 	== false )
			)
			return;

		/**
	 	 * @brief Valor de Retorno
	 	 */
		$retval = "";



		if(!$center){
			$imgx = $x;
			$textx 	= $x;
		}
		else{
			$imgx = 0;
			$textx = 0;
		}
		$hrx	= $x;
		$imgy 	= $y;
		$texty 	= $y;
		$hry	= $y;

		if(isset($img['position']))
			switch ($img['position']){

				case 'up':
					$textheight = cefpdf::get_text_height($footers);
					$imgy += $textheight + $img['height'];
					$texty+= $textheight + 1;

					break;

				case 'left':
					if(isset($img['width']) && $center)
						$textx+=$img['width']/2;
					else if(isset($img['width']))
						$textx+=$img['width'];

					/**
					 * Si el pìe de pagina esta centrado se mueve la imagen a la izquierda del texto
					 */
					if($center && ($footers != NULL || $footers != false) )
						$imgx -= cefpdf::get_text_width($footers)/2;

					/**
					 * Se mueve la posicion vertical de las imagenes y textos
					 */
					$textheight = cefpdf::get_text_height($footers);
					if(isset($img['height']))
						$maxheight = $textheight > $img['height'] ? $textheight : $img['height'];
					else
						$maxheight = $textheight;

					$texty 	+= $maxheight;
					$imgy 	+= $maxheight;

					break;

				case 'right':

					$textwidth = cefpdf::get_text_width($footers);

					if(isset($img['width']) && $center)
						$textx-=$img['width']/2;
					else if(isset($img['width']))
						$textx-=$img['width'];

					$imgx += $textwidth;

					/**
					 * Si el pìe de pagina esta centrado se mueve la imagen a la derecha del texto
					 */
					if($center && ($footers != NULL || $footers != false) )
						$imgx -= cefpdf::get_text_width($footers)/2;

					/**
					 * Se mueve la posicion vertical de las imagenes y textos
					 */
					$textheight = cefpdf::get_text_height($footers);
					if(isset($img['height']))
						$maxheight = $textheight > $img['height'] ? $textheight : $img['height'];
					else
						$maxheight = $textheight;

					$texty 	+= $maxheight;
					$imgy 	+= $maxheight;

					break;

				case 'down';
					$imgy += $img['height'];
					if(isset($img['height']))
						$texty += $img['height'] + cefpdf::get_text_height($footers);
					break;
				default:
					$texty+=cefpdf::get_text_height($footers);
			}
			else
				$texty+=cefpdf::get_text_height($footers)+2;

		/**
		 * Se consigue la posicion vertical de la linea del pie de pagina
		 * Solo nos interesa si esta ajustado algun valor para la linea horizontal
		 */

		if(	$hr != NULL	&& $hr != false )
			$hry = $imgy > $texty ? $imgy : $texty;

		$retval.=cefpdf::img($img,$center,$imgx,"\$pdf->get_height()-".$imgy);
		$retval.=cefpdf::text($footers,$center,$textx,"\$pdf->get_height()-".$texty);
		$retval.=cefpdf::horizontalrule($hr,$hrx,"\$pdf->get_height()-".$hry);

		return $retval;
	}

	static public function pages($page = true, $position = "NW", $x = 0, $y = 0, $font = 'serif', $size = 6){

		if($page == false)
			return;

		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		/**
		 * Se ajusta el texto que deseamos imprimir, en el caso de las paginas se hace de las variables de dompdf para este proposito
		 */
		$pages[0]['text'] = "{PAGE_NUM}/{PAGE_COUNT}";
		$pages[0]['font'] = $font;
		$pages[0]['size'] = $size;
		$pages[0]['position'] = $position;

		/**
		 * Se ajustan las coordenadas de la paginacion dependiendo de la ubicacion donde se desea colocar
		 * Los valores posibles para la ubicacion son
		 * NW 	: Noroeste
		 * N	: Norte
		 * NE	: Noreste
		 * SW	: Suroeste
		 * S	: Sur
		 * SE	: Sureste
		 */
		switch($pages[0]['position']){
			case 'NE': default:
				$x = "\$pdf->get_width()-Font_Metrics::get_text_width(\$pdf->get_page_number().\"/\".\$pdf->get_page_count(),Font_Metrics::get_font(\"".$pages[0]['font']."\"),".$pages[0]['size'].") - ".$x;
				break;
			case 'N':
				$x = "\$pdf->get_width()/2-Font_Metrics::get_text_width(\$pdf->get_page_number().\"/\".\$pdf->get_page_count(),Font_Metrics::get_font(\"".$pages[0]['font']."\"),".$pages[0]['size'].")/2";
				break;
			case 'NW':
				break;
			case 'SE':
				$x = "\$pdf->get_width()-Font_Metrics::get_text_width(\$pdf->get_page_number().\"/\".\$pdf->get_page_count(),Font_Metrics::get_font(\"".$pages[0]['font']."\"),".$pages[0]['size'].") - ".$x;
				$y = "\$pdf->get_height()-".cefpdf::get_text_height($pages)."-".$y;
				break;
			case 'S':
				$x = "\$pdf->get_width()/2-Font_Metrics::get_text_width(\$pdf->get_page_number().\"/\".\$pdf->get_page_count(),Font_Metrics::get_font(\"".$pages[0]['font']."\"),".$pages[0]['size'].")/2";
				$y = "\$pdf->get_height()-".cefpdf::get_text_height($pages)."-".$y;
				break;
			case 'SW':
				$y = "\$pdf->get_height()-".cefpdf::get_text_height($pages)."-".$y;
				break;
		}

		return cefpdf::text($pages,false,$x,$y);
	}

	static public function tables($matrix, $titles, $keys, $font = "serif", $font_size = 10, $align = NULL, $width = NULL, $style = NULL, $spacing = NULL, $color = NULL, $collapse = NULL, $bgcolor = NULL, $padding = NULL, $fontcolor = NULL){

		if($matrix == NULL)
			return "";
		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		/**
		 * Si no le pasan fontcolor o le pasan un arreglo con un tamaño distinto
		 * al numero de filas en la matriz entonces fontcolor negro por omision
		 * para toda fila
		 */
		if(!$fontcolor || count($fontcolor) != count($matrix))
		  for($i = 0 ; $i < count($matrix) ; $i++)
		    $fontcolor[$i] = '#000000';

		/**
		 * Matriz con titulos (titulos de las columnas), claves (indices de la matriz) y colores de texto para filas.
		 */
		$smarty->assign("matrix", $matrix);
		$smarty->assign("titles", $titles);
		$smarty->assign("keys", $keys);
		$smarty->assign("fontcolor", $fontcolor);

		/**
		 * Se ajustan los valores por omision de la tabla para el ancho de los bordes
		 */
		if(!isset($align[CEF_TH]))
			$align[CEF_TH] = "center";
		if(!isset($align[CEF_TD]))
			$align[CEF_TD] = "center";

		/**
		 * Se ajustan los valores por omision de la tabla para el ancho de los bordes
		 */
		if(!isset($width[CEF_TABLE]))
			$width[CEF_TABLE] = array("0.25px","0.25px","0.25px","0.25px");
		if(!isset($width[CEF_TH]))
			$width[CEF_TH] = array("0.25px","0.25px","0.25px","0.25px");
		if(!isset($width[CEF_TD]))
			$width[CEF_TD] = array("0.25px","0.25px","0.25px","0.25px");

		/**
		 * Se ajustan los valores por omision de la tabla para los estilos de los bordes
		 */
		if(!isset($style[CEF_TABLE]))
			$style[CEF_TABLE] = array("solid","solid","solid","solid");
		if(!isset($style[CEF_TH]))
			$style[CEF_TH] = array("solid","solid","solid","solid");
		if(!isset($style[CEF_TD]))
			$style[CEF_TD] = array("solid","solid","solid","solid");

		/**
		 * Se ajustan los valores por omision de la tabla para el espaciado de los bordes
		 */
		if(!isset($spacing[CEF_TABLE]))
			$spacing[CEF_TABLE] = "0px";

		/**
		 * Se ajustan los valores por omision de la tabla para el color de los bordes
		 */
		if(!isset($color[CEF_TABLE]))
			$color[CEF_TABLE] = array("black","black","black","black");
		if(!isset($color[CEF_TH]))
			$color[CEF_TH]  = array("black","black","black","black");
		if(!isset($color[CEF_TD]))
			$color[CEF_TD]  = array("black","black","black","black");

		/**
		 * Se ajustan los valores por omision de la tabla para collapse
		 */
		if(!isset($collapse[CEF_TABLE]))
			$collapse[CEF_TABLE] = "center";

		/**
		 * Se ajustan los valores por omision de la tabla para el bgcolor
		 */
		if(!isset($bgcolor[CEF_TABLE]))
			$bgcolor[CEF_TABLE] = "white";
		if(!isset($bgcolor[CEF_TH]))
			$bgcolor[CEF_TH] = "white";
		if(!isset($bgcolor[CEF_TD]))
			$bgcolor[CEF_TD] = "white";

		/**
		 * Se ajustan los valores por omision de la tabla para el padding (solo en CEF_TH y CEF_TD)
		 */
		if(!isset($padding[CEF_TH]))
			$padding[CEF_TH] = array("1px","3px","1px","3px");
		if(!isset($padding[CEF_TD]))
			$padding[CEF_TD] = array("1px","3px","1px","3px");

		$smarty->assign("align",$align);
		$smarty->assign("width",$width);
		$smarty->assign("style",$style);
		$smarty->assign("spacing",$spacing);
		$smarty->assign("color",$color);
		$smarty->assign("collapse",$collapse);
		$smarty->assign("bgcolor",$bgcolor);
		$smarty->assign("padding",$padding);
		$smarty->assign("font",$font);
		$smarty->assign("size",$font_size);

		return mb_convert_encoding($smarty->fetch('tables.tpl'),"ISO-8859-1","UTF-8");

	}


	static private function text($text = NULL, $center = false, $x = 0, $y = 0){

		if(	$text == NULL || $text == false )
			return "";

		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		/**
		 * @brief Valor de Retorno
		 */
		$retval = "";

		/**
		 * @brief Numero de la linea que se esta renderizando
		 */
		$line_number = 0;

		foreach	($text as $line){

			cefpdf::set_line($line);

			$smarty->assign("x",$x);
			$smarty->assign("y",$y);
			$smarty->assign("line",$line_number++);

			$smarty->assign("center",$center);

			$retval.=$smarty->fetch('txt.tpl');

			if(isset($line['font']))
				$smarty->assign("prevfont",$line['font']);
			else
				$smarty->assign("prevfont",'serif');

			if(isset($line['size']))
				$smarty->assign("prevsize",$line['size']);
			else
				$smarty->assign("prevsize",6);
		}

		return $retval;
	}

	static private function img($img = NULL, $center = false, $x = 0, $y = 0){

		if(	$img == NULL ||	$img == false )
			return "";

		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		/**
		 * Valores para el arreglo de la imagen
		 *
		 * Los siguientes valores son obligatorios
		 *
		 * src		: 	Ubicacion de la imagen
		 * width	: 	Ancho de la imagen
		 * height	: 	Altura de la imagen
		 *
		 * Los siguientes valores son opcionales
		 *
		 * position : 	Ubicacion de la imagen con respecto al texto,
		 * 				puede tomar los valores (up,down,left,right),
		 * 				por omision se coloca en la posicion del encabezado (pudiendo sobreponerse al texto)
		 */
		if(isset($img['src']))
			$smarty->assign("src",$img['src']);
		else
			return "";

		if(isset($img['width']))
			$smarty->assign("width",$img['width']);
		else
			return "";

		if(isset($img['height']))
			$smarty->assign("height",$img['height']);
		else
			return "";

		/**
		 * Se consigue la extension de la imagen para su renderizacion
		 */
		$dot = strpos($img['src'],".");
		$ext = substr($img['src'],$dot+1,strlen($img['src'])-$dot-1);

		$smarty->assign("ext",$ext);

		$smarty->assign("x",$x);
		$smarty->assign("y",$y);

		$smarty->assign("center",$center);

		return $smarty->fetch('img.tpl');

	}

	static private function horizontalrule($hr = NULL, $x = 0, $y = 0){

		if(	$hr == NULL	|| $hr == false )
			return "";

		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		/**
		 * Valores para el arreglo de la linea horizontal
		 *
		 * width	: 	Ancho de la imagen
		 * color	: 	Array con indices (r,g,b) en ese orden estrictamente
		 *
		 */

		if(isset($hr['width']))
			$smarty->assign("width",$hr['width']);
		else
			$smarty->assign("width",1);

		if(isset($hr['color']))
			$smarty->assign("r",$hr['color'][CEF_R]);
		else
			$smarty->assign("r",0);

		if(isset($hr['color']))
			$smarty->assign("g",$hr['color'][CEF_G]);
		else
			$smarty->assign("g",0);

		if(isset($hr['color']))
			$smarty->assign("b",$hr['color'][CEF_B]);
		else
			$smarty->assign("b",0);

		$smarty->assign("x",$x);
		$smarty->assign("y",$y);

		return $smarty->fetch('hr.tpl');
	}

	static private function get_text_height($text = NULL){

		if(	$text == NULL || $text == false )
			return 0;

		$textheight = 0;

		foreach ($text as $line){
			/**
			 * @brief Se ajusta el tipo de fuente
			 */
			if(isset($line['font']))
				$font = $line['font'];
			else
				$font = 'serif';

			/**
			 * @brief Se ajusta el tamaño de la fuente
			 */
			if(isset($line['size']))
				$size = $line['size'];
			else
				$size = 6;

			/**
			 * @brief Se ajusta el estilo de la fuente
			 */
			if(isset($line['style']))
				$style = $line['style'];
			else
				$style = "";

			$textheight+=Font_Metrics::get_font_height(Font_Metrics::get_font($font,$style), $size);
		}

		return $textheight;
	}

	static private function get_text_width($text = NULL){

		if(	$text == NULL || $text == false )
			return 0;

		$textwidth = 0;

		foreach ($text as $line){
			/**
		  	 * @brief Se ajusta el tipo de fuente
		   	 */
			if(isset($line['font']))
				$font = $line['font'];
			else
				$font = 'serif';

			/**
			 * @brief Se ajusta el tamaño de la fuente
		 	 */
			if(isset($line['size']))
				$size = $line['size'];
			else
				$size = 6;

			/**
			 * @brief Se calcula el texto mas largo dentro del texto
		 	 */
			$this_width = Font_Metrics::get_text_width($line['text'],Font_Metrics::get_font($font), $size);
			$textwidth =  $this_width > $textwidth ? $this_width:$textwidth;
		}

		return $textwidth;
	}

	static private function set_line($line = NULL){

		if(	$line == NULL || $line == false )
			return "";

		global $smarty;
		$smarty->template_dir = dirname(__FILE__).'/';

		/**
		 * @brief Valores para el arreglo de texto
		 *
		 * text		: Contiene el texto que se desea imprimir
		 * font		: Tipo de fuente
		 * size		: Tamaño de fuente
		 * style	: Estilo de la fuente
		 * color 	: Array con indices (r,g,b) en ese orden estrictamente
		 */

		$smarty->assign("text",$line['text']);

		if(isset($line['font']))
			$smarty->assign("font",$line['font']);
		else
			$smarty->assign("font",'serif');

		if(isset($line['size']))
			$smarty->assign("size",$line['size']);
		else
			$smarty->assign("size",6);

		if(isset($line['style']))
			$smarty->assign("style",$line['style']);
		else
			$smarty->assign("style",'');

		if(isset($line['color']))
			$smarty->assign("r",$line['color'][CEF_R]);
		else
			$smarty->assign("r",0);

		if(isset($line['color']))
			$smarty->assign("g",$line['color'][CEF_G]);
		else
			$smarty->assign("g",0);

		if(isset($line['color']))
			$smarty->assign("b",$line['color'][CEF_B]);
		else
			$smarty->assign("b",0);

	}

	/**
	 * Carga Temas personalizados por el usuario final... del API
	 *
	 * @param String $filename
	 *
	 * Todas las variables que se encuentran ubicadas en la funcion debe estar ajustadas, las que no se deseen deben tener el valor null o false
	 *
	 * $cefmargins	: Margenes del PDF
	 *
	 * Las variables con el prefijo cefh son variables para las cabeceras del archivo PDF
	 *
	 * $cefhtext	: Texto
	 * $cefhimage	: Imagen
	 * $cefhhr		: Linea Horizontal
	 * $cefhcenter	: Si se desea centrar
	 * $cefhx		: Offset Horizontal
	 * $cefhy		: Offset Vertical
	 *
	 * Las variables con el prefijo ceff son variables para los pie de paginas del archivo PDF
	 *
	 * $cefftext	: Texto
	 * $ceffimage	: Imagen
	 * $ceffhr		: Linea Horizontal
	 * $ceffcenter	: Si se desea centrar
	 * $ceffx		: Offset Horizontal
	 * $ceffy		: Offset Vertical
	 *
	 * Las variables con el prefijo cefp son para determinar la paginacion del PDF
	 *
	 * $cefpages	: Si se imprime o no la paginacion
	 * $cefpagespos	: La posicion de la paginacion
	 * $cefpx		: Offset Horizontal
	 * $cefpy		: Offset Vertical
	 * $cefpfont	: Tipo de la Fuente
	 * $cefpsize	: Tamaño de la fuente
	 */
	static public function load_theme($filename){

		require_once($filename);

		global $smarty;

		$smarty->assign("cefmargins",cefpdf::margins($cefmargins));

		/**
		 * @brief Se carga la cabecera con el texto y las imagenes
		 */
		$smarty->assign("cefheader",cefpdf::headers($cefhtext,$cefhimage,$cefhhr,$cefhcenter,$cefhx,$cefhy));

		/**
		 * @brief Se carga el pie de pagina con el texto y las imagenes
		 */
		$smarty->assign("ceffooter",cefpdf::footers($cefftext,$ceffimage,$ceffhr,$ceffcenter,$ceffx,$ceffy));

		/**
		 * @brief Se asigna una paginacion paa el pdf, la variable smarty asignada SIEMPRE debe colocarse al final del documento HTML
		 */
		if($cefpages)
			$smarty->assign("cefpages",cefpdf::pages($cefpages,$cefpagespos,$cefpx,$cefpy,$cefpfont,$cefpsize));
	}

	static public function fixed_latin($matrix,$titles,$keys){

	}
}

?>